import dayjs from 'dayjs';
export const getUID = () => {
  // 获取唯一值
  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
    const r = (Math.random() * 16) | 0;
    const v = c === 'x' ? r : (r & 0x3) | 0x8;
    return v.toString(16);
  });
};
// 常用函数，[{label, value}] => {value: label}
export const toolOptions2Map = (options: any[] = []) => {
  return options.reduce((a: any, b: any) => {
    if (!(b.value === null || b.value === undefined || b.value === '')) a[b.value] = b.label || '-';
    return a;
  }, {});
};

// 返回项目路径
export function toolGetNormalPath(p: any) {
  if (p.length === 0 || !p || p === 'undefined') {
    return p;
  }
  const res = p.replace('//', '/');
  if (res[res.length - 1] === '/') {
    return res.slice(0, res.length - 1);
  }
  return res;
}
// 复制文本
export const toolCopyText = (str: any) => {
  const input = document.createElement('input');
  document.body.appendChild(input);
  input.setAttribute('value', str);
  input.select();
  if (document.execCommand('copy')) document.execCommand('copy');
  document.body.removeChild(input);
};
// 替换富文本编辑器输入回车空格，标签
export const toolReplaceEditorInput = (str: string) => {
  return str
    .replace(/<[^<p>]+>/g, '')
    .replace(/<[</p>$]+>/g, '')
    .replace(/&nbsp;/gi, '')
    .replace(/<[^<br/>]+>/g, '');
};

/** 获取当前变量类型 */
export const toolGetPropertyType = (value: any) => {
  return Object.prototype.toString.call(value).slice(8, -1);
};
/** 获取日期间隔多少天 */
export const toolGetDiffDateTime = (time: number) => {
  const startTime = dayjs();
  const endTime = dayjs.unix(time);
  const diffDays = endTime.diff(startTime, 'day');
  // 获取小时和分钟
  const diffHours = endTime.diff(startTime, 'hour') % 24;
  const diffMinutes = endTime.diff(startTime, 'minute') % 60;
  return [`${diffDays}天 ${diffHours}小时 ${diffMinutes}分钟`, diffDays];
};
/**
 * @description 通过配置，获取日期范围
 * @param range number[] - 可以是 number[],默认单位为天。 也可以是 [number|string[] number|string[]],单位自定义，为起始时间的单位，终止单位都是'd'。 用于适配前后日期。例如 [1,7,15] 或者 [[1, 7, 'month'], [1, 15, 'day'], [2, 14]]
 * @param format string[] - ['格式', '格式']，例如 [undefined, 'substract'],即为当前时间前一天，返回[dayjs(), dayjs().substract(1, 'day')]
 * @returns {text: string, value: () => [dayjs, dayjs]}[]
 */
export const useDateRange = (range: any[], format: any[] = ['substract', undefined]) => {
  const [beginDateGetter, endDateGetter] = format;
  const dateRange = range?.map((item = 0) => {
    /** 先判断行项目的类型 */
    /** 如果是number类型，则默认单位为天。value返回根据number来判断 */
    if (toolGetPropertyType(item) === 'Number') {
      const dayNum = Math.abs(Number.parseInt(item));
      const startDate = ['substract', 'add'].includes(beginDateGetter) ? (beginDateGetter === 'add' ? dayjs().add(dayNum, 'd') : dayjs().subtract(dayNum, 'd')) : dayjs();
      return {
        text: `${item === 0 ? '今天' : item === 1 ? '昨天' : `近${dayNum}天`}`,
        value: () => [startDate, dayjs()]
      };
    } else if (toolGetPropertyType(item) === 'Array') {
      /** 如果是Array类型，则单位由配置选项决定 */
      const [startNum = 0, endNum = 0, unit = 'd'] = item;
      const startDayNum = Math.abs(Number.parseInt(startNum));
      const endDayNum = Math.abs(Number.parseInt(endNum));
      const startDate = ['substract', 'add'].includes(beginDateGetter)
        ? beginDateGetter === 'add'
          ? dayjs().add(startDayNum, unit)
          : dayjs().subtract(startDayNum, unit)
        : dayjs();
      /** 截止日期的单位为天 */
      const endDate = ['substract', 'add'].includes(endDateGetter) ? (endDateGetter === 'add' ? dayjs().add(endDayNum, 'd') : dayjs().subtract(endDayNum, 'd')) : dayjs();
      const diffDayNum = startDayNum - endDayNum + 1;
      const text = `${diffDayNum === 1 ? '昨天' : `近${diffDayNum}天`}`;
      return {
        text,
        value: () => [startDate, endDate]
      };
    }
  });
  return dateRange;
};
/** 销售数据页面所需的快捷日期， 默认在 前一天的基础上 往前推 */
export const toolGetDataPageRangeShortCuts = useDateRange([[7, 1], [14, 1], [30, 1], [60, 1]], ['substract', 'substract']);
/** 快速返回 昨日，近3日，近1周，近1月的配置，默认截止日期取到前一天 */
export const toolGetDateRangeShorcuts = useDateRange(
  [
    [1, 1],
    [3, 1],
    [7, 1],
    [30, 1]
  ],
  ['substract', 'substract']
);
/**
 * 返回默认时间 （近一周 ~ 今天）
 * 原大赢加就是这个时间的需求，所以单独写一个默认值返回。
 * */
export const toolGetDefaultDate = useDateRange([[1, 0, 'week']], ['substract'])?.[0]?.value();

/**
 * 返回默认时间 （近二周 ~ 今天）
 * 原大赢加就是这个时间的需求，所以单独写一个默认值返回。
 * */
export const toolGetDefaultTwoWeekDate = useDateRange([[2, 0, 'week']], ['substract'])?.[0]?.value();

/**
 * @description 生成快速选择日期数组
 * @param dates 接收 number[]，固定单位为天，接收天数数组
 * @returns newDates shortcut[]
 *  */
export const useGetDate = (dates: any[]) => {
  const newDates: any[] = [];
  if (toolGetPropertyType(dates) === 'Array') {
    dates.forEach((item) => {
      const date = Number.parseInt(item) ?? 0;
      const text = date < 1 ? '今天' : date === 1 ? '昨天' : `${date}天前`;
      newDates.push({
        text,
        value: () => dayjs().subtract(date, 'd')
      });
    });
  }
  return newDates;
};
/** 生成详情用的快速选择日期组 */
export const toolGetSingleDateShortCuts = useGetDate([0, 1, 7, 30]);

/** 获取统计数据用的 当日的日期初始化范围 */
export const toolGetCountInitDateRange = () => {
  const initDate = toolGetDataPageRangeShortCuts?.[2]?.value() ?? [];
  const initDtArr = [initDate[0].format('YYYYMMDD'), initDate[1].format('YYYYMMDD')];

  return {
    initDate,
    initDtArr
  };
};
